#ifndef LOGX_H
#define LOGX_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdarg.h>
#include <stdlib.h>     // for size_t

enum {
	LOG_LEVEL_DEBUG = 1,
  LOG_LEVEL_INFO,
  LOG_LEVEL_WARN,
  LOG_LEVEL_ERR,
  LOG_LEVEL_FATAL,

  LOG_DEST_TERM = 1,
  LOG_DEST_FILE,
  LOG_DEST_NET,
};

// 输出到终端配置
typedef struct {
  char reserved[0];
} log_term_cfg_t;

// 输出到文件配置
#define LOG_MAX_FILE_PATH_LEN 256
typedef struct {
  char dir[LOG_MAX_FILE_PATH_LEN];          // 目录
  char file_pattern[LOG_MAX_FILE_PATH_LEN]; // 文件名模式
  size_t file_size;                         // 最大文件大小
  int  backup_size;                         // backup文件数
} log_file_cfg_t;

// 输出到网络配置
typedef struct {
  char *dest_addr;
  unsigned short dest_port;
} log_net_cfg_t;

typedef struct {
  int level;
  int dest;  // LOG_DEST_*
  int syslog_on;
  union {
    log_term_cfg_t term_cfg;
    log_file_cfg_t file_cfg;
    log_net_cfg_t net_cfg;
  } u;
} log_cfg_t;

int logx_init(log_cfg_t *log_cfg);

void logx_destroy();

void logx_set_level(int level);

// 非对外接口，不要直接用
int logx_msg(int level, const char *file, int line, const char *fmt, ...);

/* 以LOG_LEVEL_DEBUG记录 */
#define logx_debug(fmt, ...) 	\
	logx_msg(LOG_LEVEL_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_INFO记录 */
#define logx_info(fmt, ...) 		\
	logx_msg(LOG_LEVEL_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_WARN记录 */
#define logx_warn(fmt, ...) 		\
	logx_msg(LOG_LEVEL_WARN, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_ERR记录 */
#define logx_err(fmt, ...)  		\
	logx_msg(LOG_LEVEL_ERR, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_CRITICAL记录 */
#define logx_fatal(fmt, ...)  	\
	logx_msg(LOG_LEVEL_FATAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

#ifdef __cplusplus
}
#endif

#endif
